package com.finance.console.common;

import org.mindrot.jbcrypt.BCrypt;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;

public class EncryptUtils {

    // ------------------- BCrypt加密（新用户使用） -------------------
    public static String encryptPassword(String password) {
        // 生成BCrypt加密密码（带自动salt）
        return BCrypt.hashpw(password, BCrypt.gensalt(12));
    }

    // ------------------- MD5加密（兼容旧用户，仅用于验证旧密码） -------------------
    private static String md5Encrypt(String password) {
        try {
            MessageDigest md = MessageDigest.getInstance("MD5");
            byte[] bytes = md.digest(password.getBytes());
            StringBuilder sb = new StringBuilder();
            for (byte b : bytes) {
                String hex = Integer.toHexString(0xff & b);
                if (hex.length() == 1) sb.append('0');
                sb.append(hex);
            }
            return sb.toString();
        } catch (NoSuchAlgorithmException e) {
            throw new RuntimeException("MD5加密失败", e);
        }
    }

    // ------------------- 密码验证（兼容BCrypt和MD5） -------------------
    public static boolean checkPassword(String rawPassword, String encryptedPassword) {
        if (encryptedPassword == null || encryptedPassword.isEmpty()) {
            return false;
        }

        // 1. 先尝试BCrypt验证（新用户密码）
        if (encryptedPassword.startsWith("$2a$") || encryptedPassword.startsWith("$2b$")) {
            return BCrypt.checkpw(rawPassword, encryptedPassword);
        }

        // 2. 若不是BCrypt格式，尝试MD5验证（旧用户密码）
        String md5Raw = md5Encrypt(rawPassword);
        return md5Raw.equals(encryptedPassword);
    }
}